;********************************************* 
; STRING.ASM                                                              *
;  Partie de la lib Asm de LudOS                                   *
;  Auteur:tr16						   *
;  Societe: LudOS project				   *
;							              *
;  Code sous license BSD                                               *
;*********************************************





;**********************************************************
;strcpy: copie la chaine dont l'offset est dans ax dans celle dont l'offset est dans bx
;renvoie:rien
;modifie:rien
;         /\                     Destination doit pouvoir contenir Source+1     
;       /    \                    Aucune verifications n'est faite
;     /   !    \                 =risque de Buffer Overflow
;    ---------
;ax=source
;bx=destination
;**********************************************************
strcpy:
push si
push di
push ax
push bx


mov si,ax
mov di,bx

.boucleStrcpy:
lodsb 
cmp al,0              ;fin de la chaine source ?
jz .finStrcpy
mov byte [ds:di],al   ;on met al a l'adresse ds:di
inc di                ;on increment di pour qu'il "pointe" sur le prochain caractere
jmp .boucleStrcpy


.finStrcpy:
mov byte [ds:di],0 ; on met le caractere de fin de chaine

pop bx
pop ax
pop di
pop si

ret

;***************************************************
;#strcmp: compare 2 chaines, renvoie 0 si identiques, 1 sinon
;ax: offset de la chaine 1 
;bx: offset de la chaine 2
;renvoie: ax 0 ou 1
;***************************************************
strcmp:
push si
push di
push bx


mov si,ax
mov di,bx


.boucleStrcmp:
cmp byte [ds:si],0
jz .SourceFin
cmp byte [ds:di],0;ici pas besoin de section comme .SourceFin car si di=0, si != 0 vu le test precedent
jz .strcmpFaux

mov bl,[ds:di]
mov al,[ds:si]
inc si
inc di
cmp al,bl
je .boucleStrcmp

jmp .strcmpFaux



.SourceFin:
;ds:si = 0,    on verifie si ds:di = 0 pour savoir si les chaines finissent en meme temps
cmp byte [ds:di],0
jz .strcmpVrai
jmp .strcmpFaux

.strcmpVrai:
mov ax,0
jmp .strcmpFin


.strcmpFaux:
mov ax,1


.strcmpFin:

pop bx
pop di
pop si
ret 


;******************************************************
;strlen: donne la longueur de la chaine dont l'offset est dans ax
;recoit: offset chaine dans ax
;renvoie: ax, nombre de caractere sans compter le 0 terminal
;******************************************************
strlen:
push si
push cx
xor cx,cx ;compteur

mov si,ax
.boucleStrlen:
lodsb
cmp al,0
jz .finStrlen
inc cx
jmp .boucleStrlen

.finStrlen:
mov ax,cx
pop cx
pop si
ret